package main

import (
	"fmt"
	"maps"
	"slices"
	"strconv"
)

//问题
// 给定一个非空整数数组，除了某个元素只出现一次以外，
// 其余每个元素均出现两次。找出那个只出现了一次的元素。

// 采用切片的方案解决（支持找出所有只出现过一次的）
func singleNumber(nums []int) string {
	if len(nums) == 0 {
		return "0"
	}
	newSlice := make([]int, 0)
	for _, v := range nums {
		//判断切片中元素是否存在
		if !slices.Contains(newSlice, v) {
			newSlice = append(newSlice, v)
		} else {
			//如果存在就删除当前值
			index := slices.Index(newSlice, v)
			newSlice = append(newSlice[:index], newSlice[index+1:]...)
		}
	}
	//转成字符串
	var newString string
	for i, v := range newSlice {
		if i == 0 {
			newString = strconv.Itoa(v)
		} else {
			newString += "," + strconv.Itoa(v)
		}
	}
	return newString
}

// 采用map的方案解决
func singleNumberMap(nums []int) int {
	numMap := make(map[int]int)
	for _, v := range nums {
		numMap[v]++
	}
	for k := range maps.Keys(numMap) {
		if numMap[k] == 1 {
			return k
		}
	}
	return 0
}

func main() {
	num := singleNumber([]int{5, 1, 2, 1, 2, 6})
	num1 := singleNumberMap([]int{4, 1, 2, 1, 2})
	fmt.Println("最后只出现了一次的元素为", num, num1)
}
